//1 10

//使用dfs + 存储的方式, 计算 顶层收集底层
// 具体原理, 也是没弄懂, 但已经掌握一半了;
// 引入输入, 输出模块
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let rangeArr = []
rl.on("line", (line) => {
    if (rangeArr.length === 0) {
        rangeArr = line.trim().split(" ").map(Number);
        console.log(getCount(rangeArr[1]) - getCount(rangeArr[0] - 1)) // 注意,这里要 - 1
        // clear
        rangeArr.length = 0
    }
})

/**
 * 计算输入数字的二进制中不包含101 的有多少个
 * @param num {number} 传入数字
 * @return {number}
 */
function getCount(num) {
    let binary = num.toString(2).split("").map(Number);
    let map = new Map();
    return dfs(0,0,0, true )

    /**
     * dfs
     * @param pos 当前角标
     * @param prev2 左2位对应数字
     * @param prev1 左1位对应数字
     * @param limit {boolean} 是否限制
     * @return {number}
     */
    function dfs(pos, prev2, prev1, limit) {
        if(pos === binary.length) return 1;
        let str = `${pos}-${prev2}-${prev1}-${limit}`
        // 获取存储的值
        if(map.has(str)) return map.get(str);

        let limitNum = limit ? binary[pos] : 1;
        let res = 0;
        for (let i = 0; i <= limitNum; i++) {
            if(prev2 === 1 && prev1 === 0 && i === 1) continue;
            res+= dfs(pos + 1, prev1, i, limit && i === limitNum );
        }
        map.set(str, res)
        return res;
    }
}

